﻿using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using MSDAL;
using MSWeb.Models;
using System.Globalization;

namespace MSWeb
{
    public class EventProcessor
    {
        private MSEntities db;
        public static DateTime ConvertFromUnixTimestamp(double timestamp)
        {
            var origin = new DateTime(1970, 1, 1, 0, 0, 0, 0);
            return origin.AddSeconds(timestamp);
        }

        DateTime ReturnDateToWarsawTimeZone(string newDate)
        {
            DateTime newDates = DateTime.Parse(newDate, null, DateTimeStyles.RoundtripKind);
            TimeZoneInfo usersTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Central European Standard Time");
            return TimeZoneInfo.ConvertTimeFromUtc(newDates, usersTimeZone);
        }

        private static DateTime UnixTimeStampToDateTime(double unixTimeStamp)
        {
            DateTime dtDateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Local);
            dtDateTime = dtDateTime.AddSeconds(unixTimeStamp).ToLocalTime();
            return dtDateTime;
        }

        public EventProcessor()
        {
            db = new MSEntities();
        }

        public void UpdateLesson(int id, string NewEventStart, string NewEventEnd)
        {
            Lekcje lekcja = db.Lekcje.FirstOrDefault(i => i.IDLekcji == id);
            if (lekcja != null)
            {
                DateTime newDate = ReturnDateToWarsawTimeZone(NewEventStart);
                lekcja.Data = newDate;
                if (!String.IsNullOrEmpty(NewEventEnd))
                {
                    DateTime eventNewDate = ReturnDateToWarsawTimeZone(NewEventEnd);
                    TimeSpan span = eventNewDate - newDate;
                    lekcja.CzasTrwaniaLekcji = Convert.ToInt32(span.TotalMinutes);
                }
                db.Entry(lekcja).State = EntityState.Modified;
                db.SaveChanges();
            }
        }

        public List<Events> GetLessonList(double from, double to)
        {
            try
            {
                //var fromDate = ReturnDateToWarsawTimeZone(UnixTimeStampToDateTime(from));
                var endDate = ConvertFromUnixTimestamp(to);
                var lekcje = new List<Lekcje>();
                var res = db.Lekcje
                        .Include(l => l.Nauczyciele)
                        .Include(l => l.Sale)
                        .Include(l => l.Uczniowie)
                .Where(i => i.Data.Value.Year == endDate.Date.Year
                && i.Data.Value.Month == endDate.Date.Month
                && i.Data.Value.Day == endDate.Date.Day
                && (i.CzyUsunieta != true))
                .ToList();
                var eventList = new List<Events>();
                string color = "Red";
                res.ForEach(lekcja =>
                {
                    var dataPlus = lekcja.Data.Value.AddHours(1);
                    try
                    {
                        if (lekcja.Sale.IdKoloru != null)
                        {
                            var idKoloru = lekcja.Sale.IdKoloru.Value;
                            if (db.Colors.Any(i => i.IdKoloru == idKoloru))
                            {
                                color = db.Colors
                                    .FirstOrDefault(i => i.IdKoloru == idKoloru)
                                    .NazwaAngielska;
                            }
                        }
                        eventList.Add(new Events
                        {
                            color = color,
                            id = lekcja.IDLekcji.ToString(),
                            start = lekcja.Data.Value.ToString("s"),
                            end = lekcja.Data.Value.AddMinutes(double.Parse(lekcja.CzasTrwaniaLekcji.ToString())).ToString("s"),
                            allDay = false,
                            title = "Uczeń: " + lekcja.Uczniowie.Imie + " " + lekcja.Uczniowie.Nazwisko                        
                        });
                    }
                    catch
                    {
                        // ignored
                    }
                });
                return eventList;
            }
            catch
            {
                return new List<Events>();
            }
        }

    }
}